import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';

/// 自定义Lottie动画组件
///
/// 该组件在Lottie基础上进行封装，提供更便捷的动画控制功能
/// 支持设置动画循环播放、循环次数、动画尺寸及播放完成回调
class CustomLottieWidget extends StatefulWidget {
  /// 动画资源路径（支持assets路径，网络URL或文件路径）
  final String animationPath;

  /// 动画宽度
  final double? width;

  /// 动画高度
  final double? height;

  /// 是否循环播放
  final bool repeat;

  /// 循环播放次数，仅在repeat为true时有效
  /// 设置为null时无限循环播放
  final int? repeatCount;

  /// 动画播放完成回调
  /// 当repeat为false时，播放一次后触发
  /// 当repeat为true且repeatCount不为null时，播放指定次数后触发
  final VoidCallback? onComplete;

  /// 动画速度，默认为1.0
  final double speed;

  /// 是否自动播放
  final bool autoPlay;

  /// 动画控制器，可以传入外部控制器进行更精细的控制
  final AnimationController? controller;

  /// 是否反向播放
  final bool reverse;

  /// 动画对齐方式
  final Alignment? alignment;

  /// 动画适应方式
  final BoxFit? fit;

  const CustomLottieWidget({
    Key? key,
    required this.animationPath,
    this.width,
    this.height,
    this.repeat = true,
    this.repeatCount,
    this.onComplete,
    this.speed = 1.0,
    this.autoPlay = true,
    this.controller,
    this.reverse = false,
    this.alignment,
    this.fit,
  }) : super(key: key);

  @override
  State<CustomLottieWidget> createState() => _CustomLottieWidgetState();
}

class _CustomLottieWidgetState extends State<CustomLottieWidget>
    with SingleTickerProviderStateMixin {
  /// 内部动画控制器
  late AnimationController _controller;

  /// 已播放次数
  int _playCount = 0;

  /// 当前动画持续时间
  Duration? _originalDuration;

  @override
  void initState() {
    super.initState();

    // 初始化动画控制器
    if (widget.controller != null) {
      _controller = widget.controller!;
    } else {
      _controller = AnimationController(
        vsync: this,
        duration: const Duration(milliseconds: 1000), // 默认持续时间，将在加载动画后更新
      );
    }

    // 监听动画状态
    _controller.addStatusListener(_animationStatusListener);

    // 自动播放
    if (widget.autoPlay) {
      _controller.forward();
    }
  }

  @override
  void didUpdateWidget(CustomLottieWidget oldWidget) {
    super.didUpdateWidget(oldWidget);

    // 检查关键属性是否发生变化
    bool needReset = false;

    // 检查repeat属性变化
    if (widget.repeat != oldWidget.repeat) {
      needReset = true;
    }

    // 检查repeatCount属性变化
    if (widget.repeatCount != oldWidget.repeatCount) {
      needReset = true;
    }

    // 检查speed属性变化
    if (widget.speed != oldWidget.speed && _originalDuration != null) {
      // 更新动画速度
      _controller.duration = Duration(
          milliseconds:
              (_originalDuration!.inMilliseconds / widget.speed).round());
    }

    // 如果autoPlay状态发生变化
    if (widget.autoPlay != oldWidget.autoPlay) {
      if (widget.autoPlay) {
        // 如果当前状态变为自动播放，则开始播放
        if (!_controller.isAnimating) {
          _controller.forward();
        }
      } else {
        // 如果当前状态变为非自动播放，则停止播放
        if (_controller.isAnimating) {
          _controller.stop();
        }
      }
    }

    // 如果需要重置动画，则重置播放计数和控制器状态
    if (needReset) {
      _playCount = 0;

      if (_controller.isAnimating) {
        _controller.stop();
      }

      _controller.reset();

      if (widget.autoPlay) {
        _controller.forward();
      }
    }
  }

  @override
  void dispose() {
    // 移除监听器并释放控制器
    _controller.removeStatusListener(_animationStatusListener);
    if (widget.controller == null) {
      _controller.dispose();
    }
    super.dispose();
  }

  /// 动画状态监听回调
  void _animationStatusListener(AnimationStatus status) {
    if (status == AnimationStatus.completed) {
      _playCount++;

      // 判断是否需要循环播放
      if (widget.repeat) {
        // 判断是否达到指定循环次数
        if (widget.repeatCount != null && _playCount >= widget.repeatCount!) {
          // 播放完成，触发回调
          if (widget.onComplete != null) {
            widget.onComplete!();
          }
        } else {
          // 继续循环播放
          if (widget.reverse) {
            _controller.reverse();
          } else {
            _controller.reset();
            _controller.forward();
          }
        }
      } else {
        // 不循环播放，播放完成后触发回调
        if (widget.onComplete != null) {
          widget.onComplete!();
        }
      }
    } else if (status == AnimationStatus.dismissed && widget.reverse) {
      // 反向播放完成后，再次正向播放
      _controller.forward();
    }
  }

  @override
  Widget build(BuildContext context) {
    // 判断动画资源类型
    String assetPath;
    if (widget.animationPath.startsWith('http')) {
      // 网络资源
      return Lottie.network(
        widget.animationPath,
        width: widget.width,
        height: widget.height,
        controller: _controller,
        onLoaded: (composition) {
          // 保存原始持续时间
          _originalDuration = composition.duration;

          // 更新动画控制器的持续时间
          _controller.duration = composition.duration;

          // 设置动画速度
          if (widget.speed != 1.0) {
            _controller.duration = Duration(
                milliseconds:
                    (composition.duration.inMilliseconds / widget.speed)
                        .round());
          }

          // 自动播放
          if (widget.autoPlay && !_controller.isAnimating) {
            _controller.reset();
            _controller.forward();
          }
        },
        frameRate: FrameRate.max, // 使用最高帧率
        alignment: widget.alignment ?? Alignment.center,
        fit: widget.fit ?? BoxFit.contain,
      );
    } else if (widget.animationPath.startsWith('assets/')) {
      // 资源文件
      assetPath = widget.animationPath;
    } else {
      // 默认为资源文件，添加assets/前缀
      assetPath = 'assets/${widget.animationPath}';
    }

    return Lottie.asset(
      assetPath,
      width: widget.width,
      height: widget.height,
      controller: _controller,
      onLoaded: (composition) {
        // 保存原始持续时间
        _originalDuration = composition.duration;

        // 更新动画控制器的持续时间
        _controller.duration = composition.duration;

        // 设置动画速度
        if (widget.speed != 1.0) {
          _controller.duration = Duration(
              milliseconds:
                  (composition.duration.inMilliseconds / widget.speed).round());
        }

        // 自动播放
        if (widget.autoPlay && !_controller.isAnimating) {
          _controller.reset();
          _controller.forward();
        }
      },
      frameRate: FrameRate.max, // 使用最高帧率
      alignment: widget.alignment ?? Alignment.center,
      fit: widget.fit ?? BoxFit.contain,
    );
  }
}
